package accidence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.*;

/**
 * 输入n个整数，输出其中最小的k个
 *
 * @author sdm
 * @version 1.0
 * @date 2023/3/20 8:36
 */
@RunWith(JUnit4.class) //就是指用JUnit4来运行
public class HJ58 {

    /**
     *   Comparator.reverseOrder  反向自然排序   http://t.csdn.cn/qzfZ5
     *      是Java 8中引入的一个静态方法，它返回比较器
     *      自然排序，一个类需要实现Comparable并定义compareTo方法。
     *      可以将Comparator.reverseOrder与Stream.sorted、List.sort、Collections.sort和Arrays.sort一起使用，对对象的集合进行反向自然排序。
     *
     *    Comparator.naturalOrder  自然顺序
     *      数字的自然顺序是数字顺序，字符串按字母顺序排序，日期按时间顺序排序
     *
     *    在 Arrays.sort 中使用
     *      Student[] stdArray = { s1, s2, s3 };
     *      Arrays.sort(stdArray, Comparator.reverseOrder());
     *
     *    在 List.sort 中使用
     *      List<String> strList = Arrays.asList("Varanasi", "Allahabad", "Kanpur", "Noida");
     * 	    strList.sort(Comparator.reverseOrder());
     *
     * 	  在 Collections.sort 中使用
     *	    List<String> strList = Arrays.asList("Varanasi", "Allahabad", "Kanpur", "Noida");
     * 	    Collections.sort(strList, Comparator.reverseOrder());
     *
     *
     */

    /**
     * 总结：
     *  1. 循环控制台输入条件
     *      hasNext()     判断当前元素后面是否有下一个元素存在
     *      hasNextLint() 判断当前元素所在行的下一行是否有元素存在
     *  2. 循环判断控制台输入字符类型
     *      hasNextInt()   判断当前元素后面是否有下一个元素存在，且输入的元素是否Int类型
     *  3。 终止控制台输入
     *      if (in.nextLine().isEmpty()){
     *         break;
     *      }
     */

    @Test
    public void test(){
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            int a = in.nextInt();
            int b = in.nextInt();
            //System.out.println(a + b);
            if (in.nextLine().isEmpty()){
                break;
            }
        }
    }



    @Test
    public void MyHJ58(){
        Scanner in = new Scanner(System.in);  // 接收控制台输入
        ArrayList<Integer> arr = new ArrayList<>();   // int [] a 固定数组，ArrayList 动态数组
        while (in.hasNextInt()) {  // 校验控制台输入的都是int类型
            int n = in.nextInt();
            int k = in.nextInt();
            for (int i = 0; i < n; i++) {
                arr.add(in.nextInt());
            }
            arr.sort((o1,o2)->{return o1-o2;});    // 方式1. 通过lambdda表达式写比较规则
            arr.subList(0,k).stream().forEach(e -> {System.out.print(e + " ");});

        }
    }
//            arr.sort(new Comparator<Integer>() {   // 方式2. 通过匿名内部类重写比较器，也适用于对象中的某个属性排序
//                @Override
//                public int compare(Integer o1, Integer o2) {
//                    return o1 - o2;  //升序
//                    // return o2 - o1; //降序
//                }
//            });


//              Collections.sort(arr);  //方式3. 升序
//              Collections.sort(strList, Comparator.naturalOrder());  // 方式4 自然排序

}
